#ifndef REDIS_H
#define REDIS_H

#include <hiredis/hiredis.h> // -lhiredis
#include <thread>            // -lpthread
#include <functional>
using namespace std;

class Redis
{
public:
    // 构造函数
    Redis();
    // 析构函数
    ~Redis();

    // 连接redis服务器
    bool connect();

    // 向redis指定的通道发布消息
    bool publish(int channel, std::string message);

    // 向redis指定的通道订阅消息
    bool subscribe(int channel);

    // 向redis指定的通道取消订阅消息
    bool unsubscribe(int channel);

    // 在独立线程中接收订阅通道中的消息
    void observer_channel_message();

    // 初始化向业务层上报通道消息的回调对象 设置回调的公有方法
    void init_notify_handler(std::function<void(int, std::string)> fn);

private:
    // redisContext * 句柄 <==> redis-cli
    redisContext *_publish_context;                                // hiredis同步上下文对象， 负责发布消息
    redisContext *_subscribe_context;                                // hiredis同步上下文对象， 负责订阅消息
    // 拿到业务层的事件回调， 当消息通道上相应的消息发生时, redis通过上层留下的回调进行层层上报
    std::function<void(int, std::string)> _notify_message_handler; // 回调操作，收到订阅的消息， 给service层上报
};

#endif